package it.stepava.calcolocilindri;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class CalcoloCilindri extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

	}

	/* Creates the menu items */
	public boolean onCreateOptionsMenu(Menu myMenu) {
		myMenu.add(0, 0, 0, "Aggiorna Calcoli").setIcon(R.drawable.calc);
		myMenu.add(0, 1, 0, "About").setIcon(R.drawable.about);
		return true;
	}

	/* Handles item selections */
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case 0: // Aggiorna Calcoli
			refreshData();
			return true;
		case 1:
			// About
			Context context = getApplicationContext();
			Resources res = getResources();
			String text = res.getString(R.string.app_name)
					+ " by StePped Apps Versione: "
					+ res.getString(R.string.versionName);
			int duration = Toast.LENGTH_LONG;
			Toast toast = Toast.makeText(context, text, duration);
			toast.show();
			return true;
		}
		return false;
	}

	public void refreshData() {
		// Dimensioni
		EditText alesaggio = (EditText) findViewById(R.id.alesaggio);
		EditText stelo = (EditText) findViewById(R.id.stelo);
		EditText corsa = (EditText) findViewById(R.id.corsa);
		EditText areaCircolare = (EditText) findViewById(R.id.areaCircolare);
		EditText areaAnulare = (EditText) findViewById(R.id.areaAnulare);
		EditText volumeCircolare = (EditText) findViewById(R.id.volumeCircolare);
		EditText volumeAnulare = (EditText) findViewById(R.id.volumeAnulare);
		// Portata Necessaria
		EditText velocitaRichiesta = (EditText) findViewById(R.id.velocitaRichiesta);
		EditText portataNecessariaCircolare = (EditText) findViewById(R.id.portataNecessariaCircolare);
		EditText portataNecessariaAnulare = (EditText) findViewById(R.id.portataNecessariaAnulare);
		EditText portataNecessariaRigenerativo = (EditText) findViewById(R.id.portataNecessariaRigenerativo);
		// Tempi e Velocità
		EditText portataDisponibile = (EditText) findViewById(R.id.portataDisponibile);
		EditText velocitaUscitaStelo = (EditText) findViewById(R.id.velocitaUscitaStelo);
		EditText velocitaEntrataStelo = (EditText) findViewById(R.id.velocitaEntrataStelo);
		EditText tempoUscitaStelo = (EditText) findViewById(R.id.tempoUscitaStelo);
		EditText tempoEntrataStelo = (EditText) findViewById(R.id.tempoEntrataStelo);
		EditText portataUscitaSezioneAnulare = (EditText) findViewById(R.id.portataUscitaSezioneAnulare);
		EditText portataUscitaSezioneCircolare = (EditText) findViewById(R.id.portataUscitaSezioneCircolare);
		// Forze e Pressioni
		EditText forzaRichiestaSpinta = (EditText) findViewById(R.id.forzaRichiestaSpinta);
		EditText forzaRichiestaTrazione = (EditText) findViewById(R.id.forzaRichiestaTrazione);
		EditText rendimento = (EditText) findViewById(R.id.rendimento);
		EditText pressioneDisponibile = (EditText) findViewById(R.id.pressioneDisponibile);
		EditText pressioneNecessariaIngressoUscitaSpinta = (EditText) findViewById(R.id.pressioneNecessariaIngressoUscitaSpinta);
		EditText forzaTrazione = (EditText) findViewById(R.id.forzaTrazione);
		EditText potenzaSpinta = (EditText) findViewById(R.id.potenzaSpinta);
		EditText pressioneNecessariaIngressoUscitaTrazione = (EditText) findViewById(R.id.pressioneNecessariaIngressoUscitaTrazione);
		EditText forzaSpinta = (EditText) findViewById(R.id.forzaSpinta);
		EditText potenzaTrazione = (EditText) findViewById(R.id.potenzaTrazione);
		EditText forzaDisponibileSpinta = (EditText) findViewById(R.id.forzaDisponibileSpinta);
		EditText forzaDisponibileTrazione = (EditText) findViewById(R.id.forzaDisponibileTrazione);
		TextView pressioneNecessariaTrazione = (TextView) findViewById(R.id.lblPressioneNecessariaTrazione);
		TextView pressioneNecessariaSpinta = (TextView) findViewById(R.id.lblPressioneNecessariaSpinta);
		TextView rendimentoSpinta = (TextView) findViewById(R.id.lblRendimentoSpinta);
		TextView rendimentoTrazione = (TextView) findViewById(R.id.lblRendimentoTrazione);
		// Dimensionamento Meccanico
		EditText coefficienteSicurezza = (EditText) findViewById(R.id.coefficienteSicurezza);
		EditText pressioneEsercizio = (EditText) findViewById(R.id.pressioneEsercizio);
		EditText sigmaRottura = (EditText) findViewById(R.id.sigmaRottura);
		EditText sigmaAmmissibile = (EditText) findViewById(R.id.sigmaAmmissibile);
		EditText diametroEsterno = (EditText) findViewById(R.id.diametroEsterno);
		EditText diametroInterno = (EditText) findViewById(R.id.diametroInterno);
		EditText spessoreCilindro = (EditText) findViewById(R.id.spessoreCilindro);
		EditText DdFattoreBach = (EditText) findViewById(R.id.DdFattoreBach);
		;

		// Creo delle variabili
		Double piGreco = Math.PI;
		// Variabili Dimensioni
		Double numAlesaggio = 0.0;
		Double numStelo = 0.0;
		Double numCorsa = 0.0;
		Double numAreaCircolare = 0.0;
		Double numAreaAnulare = 0.0;
		Double numVolumeCircolare = 0.0;
		Double numVolumeAnulare = 0.0;
		// Varaibili Portata Necessaria
		Double numVelocitaRichiesta = 0.0;
		Double numPortataNecessariaCircolare = 0.0;
		Double numPortataNecessariaAnulare = 0.0;
		Double numPortataNecessariaRigenerativo = 0.0;
		// Variabili Tempi e Velocità
		Double numPortataDisponibile = 0.0;
		Double numVelocitaUscitaStelo = 0.0;
		Double numVelocitaEntrataStelo = 0.0;
		Double numTempoUscitaStelo = 0.0;
		Double numTempoEntrataStelo = 0.0;
		Double numPortataUscitaSezioneAnulare = 0.0;
		Double numPortataUscitaSezioneCircolare = 0.0;
		// Variabili Forze e Pressioni
		Double numForzaRichiestaSpinta = 0.0;
		Double numForzaRichiestaTrazione = 0.0;
		Double numRendimento = 0.0;
		Double numPressioneDisponibile = 0.0;
		Double numPressioneNecessariaIngressoUscitaSpinta = 0.0;
		Double numForzaTrazione = 0.0;
		Double numPotenzaSpinta = 0.0;
		Double numPressioneNecessariaIngressoUscitaTrazione = 0.0;
		Double numForzaSpinta = 0.0;
		Double numPotenzaTrazione = 0.0;
		Double numForzaDisponibileSpinta = 0.0;
		Double numForzaDisponibileTrazione = 0.0;
		// Variabili Dimensionamento meccanico
		Double numCoefficienteSicurezza = 1.0;
		Double numPressioneEsercizio = 0.0;
		Double numSigmaRottura = 0.0;
		Double numSigmaAmmissibile = 0.0;
		Double numDiametroInterno = 0.0;
		Double numDiametroEsterno = 0.0;
		Double numSpessoreCilindro = 0.0;
		Double numDdFattoreBach = 0.0;

		// Recupero i dati dagli EditText e li assegno alle variabili
		try {
			numAlesaggio = Double.parseDouble(alesaggio.getText().toString());
		} catch (NumberFormatException nfe) {
		}

		try {
			numStelo = Double.parseDouble(stelo.getText().toString());
		} catch (NumberFormatException nfe) {
		}

		try {
			numCorsa = Double.parseDouble(corsa.getText().toString());
		} catch (NumberFormatException nfe) {
		}

		try {
			numVelocitaRichiesta = Double.parseDouble(velocitaRichiesta
					.getText().toString());
		} catch (NumberFormatException nfe) {
		}

		try {
			numPortataDisponibile = Double.parseDouble(portataDisponibile
					.getText().toString());
		} catch (NumberFormatException nfe) {
		}

		try {
			numRendimento = Double.parseDouble(rendimento.getText().toString());
			if (numRendimento > 1.0) {
				numRendimento = 1.0;
			}
			rendimento.setText(Double.toString(numRendimento));
		} catch (NumberFormatException nfe) {
		}

		try {
			numForzaRichiestaSpinta = Double.parseDouble(forzaRichiestaSpinta
					.getText().toString());
		} catch (NumberFormatException nfe) {
		}

		try {
			numForzaRichiestaTrazione = Double
					.parseDouble(forzaRichiestaTrazione.getText().toString());
		} catch (NumberFormatException nfe) {
		}

		try {
			numPressioneDisponibile = Double.parseDouble(pressioneDisponibile
					.getText().toString());
		} catch (NumberFormatException nfe) {
		}

		try {
			numCoefficienteSicurezza = Double.parseDouble(coefficienteSicurezza
					.getText().toString());
			if (numCoefficienteSicurezza < 1.0) {
				numCoefficienteSicurezza = 1.0;
			}
			coefficienteSicurezza.setText(Double
					.toString(numCoefficienteSicurezza));
		} catch (NumberFormatException nfe) {
		}

		try {
			numPressioneEsercizio = Double.parseDouble(pressioneEsercizio
					.getText().toString());
		} catch (NumberFormatException nfe) {
		}

		try {
			numSigmaRottura = Double.parseDouble(sigmaRottura.getText()
					.toString());
		} catch (NumberFormatException nfe) {
		}

		// calcolo l'Area Circolare e la mostro
		numAreaCircolare = (numAlesaggio * numAlesaggio) * piGreco / (400);
		String numAreaCircolareFormat = String.format("%.3f", numAreaCircolare);
		areaCircolare.setText(numAreaCircolareFormat);

		// calcolo l'Area Anulare e la mostro
		numAreaAnulare = ((numAlesaggio * numAlesaggio) - (numStelo * numStelo))
				* piGreco / (400);
		String numAreaAnulareFormat = String.format("%.3f", numAreaAnulare);
		areaAnulare.setText(numAreaAnulareFormat);

		// calcolo il Volume Circolare e lo mostro
		numVolumeCircolare = (numAreaCircolare * numCorsa / 10);
		String numVolumeCircolareFormat = String.format("%.3f",
				numVolumeCircolare);
		volumeCircolare.setText(numVolumeCircolareFormat);

		// calcolo il Volume Anulare e lo mostro
		numVolumeAnulare = (numAreaAnulare * numCorsa / 10);
		String numVolumeAnulareFormat = String.format("%.3f", numVolumeAnulare);
		volumeAnulare.setText(numVolumeAnulareFormat);

		// ----------------------------------------------------------------

		// calcolo la Portata necessaria sezione Circolare e lo mostro
		numPortataNecessariaCircolare = ((numAreaCircolare / 100)
				* (numVelocitaRichiesta / 100) * 60);
		String numPortataNecessariaCircolareFormat = String.format("%.3f",
				numPortataNecessariaCircolare);
		portataNecessariaCircolare.setText(numPortataNecessariaCircolareFormat);

		// calcolo la Portata necessaria sezione Anulare e lo mostro
		numPortataNecessariaAnulare = ((numAreaAnulare / 100)
				* (numVelocitaRichiesta / 100) * 60);
		String numPortataNecessariaAnulareFormat = String.format("%.3f",
				numPortataNecessariaAnulare);
		portataNecessariaAnulare.setText(numPortataNecessariaAnulareFormat);

		// calcolo la Portata necessaria in rigenerativo e lo mostro
		numPortataNecessariaRigenerativo = (((numAreaCircolare - numAreaAnulare) / 100)
				* (numVelocitaRichiesta / 100) * 60);
		String numPortataNecessariaRigenerativoFormat = String.format("%.3f",
				numPortataNecessariaRigenerativo);
		portataNecessariaRigenerativo
				.setText(numPortataNecessariaRigenerativoFormat);

		// ----------------------------------------------------------------

		// calcolo la velocità di uscita dello stelo e lo mostro
		numVelocitaUscitaStelo = (numPortataDisponibile / numAreaCircolare
				* 100 / 60 * 100);
		String numVelocitaUscitaSteloFormat = String.format("%.3f",
				numVelocitaUscitaStelo);
		velocitaUscitaStelo.setText(numVelocitaUscitaSteloFormat);

		// calcolo la velocità di entrata dello stelo e lo mostro
		numVelocitaEntrataStelo = (numPortataDisponibile / numAreaAnulare * 100
				/ 60 * 100);
		String numVelocitaEntrataSteloFormat = String.format("%.3f",
				numVelocitaEntrataStelo);
		velocitaEntrataStelo.setText(numVelocitaEntrataSteloFormat);

		// calcolo il tempo di uscita dello stelo e lo mostro
		numTempoUscitaStelo = (numCorsa / numVelocitaUscitaStelo);
		String numTempoUscitaSteloFormat = String.format("%.3f",
				numTempoUscitaStelo);
		tempoUscitaStelo.setText(numTempoUscitaSteloFormat);

		// calcolo il tempo di entrata dello stelo e lo mostro
		numTempoEntrataStelo = (numCorsa / numVelocitaEntrataStelo);
		String numTempoEntrataSteloFormat = String.format("%.3f",
				numTempoEntrataStelo);
		tempoEntrataStelo.setText(numTempoEntrataSteloFormat);

		// calcolo la Portata di uscita della sezione Anulare e lo mostro
		numPortataUscitaSezioneAnulare = (numAreaAnulare
				* numVelocitaUscitaStelo / 100 * 60 / 100);
		String numPortataUscitaSezioneAnulareFormat = String.format("%.3f",
				numPortataUscitaSezioneAnulare);
		portataUscitaSezioneAnulare
				.setText(numPortataUscitaSezioneAnulareFormat);

		// calcolo la Portata di uscita della sezione Circolare e lo mostro
		numPortataUscitaSezioneCircolare = (numAreaCircolare
				* numVelocitaEntrataStelo / 100 * 60 / 100);
		String numPortataUscitaSezioneCircolareFormat = String.format("%.3f",
				numPortataUscitaSezioneCircolare);
		portataUscitaSezioneCircolare
				.setText(numPortataUscitaSezioneCircolareFormat);

		// ----------------------------------------------------------------
		// Aggiorno le TextView del rendimento
		rendimentoSpinta.setText(Double.toString(numRendimento));
		rendimentoTrazione.setText(Double.toString(numRendimento));

		// calcolo la pressione necessaria tra ingresso e uscita in spinta
		numPressioneNecessariaIngressoUscitaSpinta = numForzaRichiestaSpinta
				/ numAreaCircolare;
		String numPressioneNecessariaIngressoUscitaSpintaFormat = String
				.format("%.3f", numPressioneNecessariaIngressoUscitaSpinta);
		pressioneNecessariaIngressoUscitaSpinta
				.setText(numPressioneNecessariaIngressoUscitaSpintaFormat);

		// calcolo la pressione necessaria tra ingresso e uscita in trazione
		numPressioneNecessariaIngressoUscitaTrazione = numForzaRichiestaTrazione
				/ numAreaAnulare;
		String numPressioneNecessariaIngressoUscitaTrazioneFormat = String
				.format("%.3f", numPressioneNecessariaIngressoUscitaTrazione);
		pressioneNecessariaIngressoUscitaTrazione
				.setText(numPressioneNecessariaIngressoUscitaTrazioneFormat);

		// Aggiorno le TextView della Pressione Necessaria tra ingresso e uscita
		pressioneNecessariaSpinta
				.setText(numPressioneNecessariaIngressoUscitaTrazioneFormat);
		pressioneNecessariaTrazione
				.setText(numPressioneNecessariaIngressoUscitaSpintaFormat);

		// calcolo la forza in spinta
		numForzaSpinta = numPressioneNecessariaIngressoUscitaTrazione
				* numAreaCircolare;
		String numForzaSpintaFormat = String.format("%.3f", numForzaSpinta);
		forzaSpinta.setText(numForzaSpintaFormat);

		// calcolo la forza in trazione
		numForzaTrazione = numPressioneNecessariaIngressoUscitaSpinta
				* numAreaAnulare;
		String numForzaTrazioneFormat = String.format("%.3f", numForzaTrazione);
		forzaTrazione.setText(numForzaTrazioneFormat);

		// calcolo la potenza in trazione
		numPotenzaTrazione = numPortataDisponibile
				* numPressioneNecessariaIngressoUscitaTrazione / numRendimento
				/ 600;
		String numPotenzaTrazioneFormat = String.format("%.3f",
				numPotenzaTrazione);
		potenzaTrazione.setText(numPotenzaTrazioneFormat);

		// calcolo la potenza in spinta
		numPotenzaSpinta = numPortataDisponibile
				* numPressioneNecessariaIngressoUscitaSpinta / numRendimento
				/ 600;
		String numPotenzaSpintaFormat = String.format("%.3f", numPotenzaSpinta);
		potenzaSpinta.setText(numPotenzaSpintaFormat);

		// calcolo Forza disponibile in spinta
		numForzaDisponibileSpinta = numPressioneDisponibile * numAreaCircolare;
		String numForzaDisponibileSpintaFormat = String.format("%.3f",
				numForzaDisponibileSpinta);
		forzaDisponibileSpinta.setText(numForzaDisponibileSpintaFormat);

		// calcolo Forza disponibile in Trazione
		numForzaDisponibileTrazione = numPressioneDisponibile * numAreaAnulare;
		String numForzaDisponibileTrazioneFormat = String.format("%.3f",
				numForzaDisponibileTrazione);
		forzaDisponibileTrazione.setText(numForzaDisponibileTrazioneFormat);

		// ----------------------------------------------------------------

		// Diametro interno è l'alessaggio, già definito
		numDiametroInterno = numAlesaggio;
		String numDiametroInternoFormat = String.format("%.3f",
				numDiametroInterno);
		diametroInterno.setText(numDiametroInternoFormat);

		// Calcolo la sigma Ammissibile
		numSigmaAmmissibile = numSigmaRottura / numCoefficienteSicurezza;
		String numSigmaAmmissibileFormat = String.format("%.3f",
				numSigmaAmmissibile);
		sigmaAmmissibile.setText(numSigmaAmmissibileFormat);

		// verifico la condizione della formula di Bach
		if (numPressioneEsercizio > ((10 * numSigmaAmmissibile) / 1.3)) {
			Context context = getApplicationContext();
			String text = "Formula di Bach non utilizzabile, modifica i parametri di Pressione esercizio o Sigma di rottura e aggiorna il calcolo";
			int duration = Toast.LENGTH_LONG;
			Toast toast = Toast.makeText(context, text, duration);
			toast.show();
			DdFattoreBach.setText("Non valido");
			diametroEsterno.setText("Non valido");
			spessoreCilindro.setText("Non valido");
		} else {
			// Calcolo il "fattore di Bach"
			numDdFattoreBach = Math
					.sqrt((10 * numSigmaAmmissibile + 0.4 * numPressioneEsercizio)
							/ (10 * numSigmaAmmissibile - 1.3 * numPressioneEsercizio));
			String numDdFattoreBachFormat = String.format("%.3f",
					numDdFattoreBach);
			DdFattoreBach.setText(numDdFattoreBachFormat);

			// Calcolo il diametro esterno
			numDiametroEsterno = numDiametroInterno * numDdFattoreBach;
			String numDiametroEsternoFormat = String.format("%.3f",
					numDiametroEsterno);
			diametroEsterno.setText(numDiametroEsternoFormat);

			// Calcolo lo spessore
			numSpessoreCilindro = (numDiametroEsterno - numDiametroInterno) / 2;
			String numSpessoreCilindroFormat = String.format("%.3f",
					numSpessoreCilindro);
			spessoreCilindro.setText(numSpessoreCilindroFormat);

		}

	}

}